package com.dylan.历史.java8.其他;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * Created by Dylan on 2018/7/30.
 */
public class 文件 {

    public static void main(String[] args) {
        /**
         * 1. 第一行被找到,文件中的其他行就不会再被读取
         * 2. 当一个流调用其他流时,close方法也会被递归调用.关闭Stream时,会自动递归调用文件的流.
         *    Stream继承了AutoCloseable接口,Stream调用了文件流,使用try-with-resources语法会自动递归调用文件流的close方法
         */
        try (Stream<String> lines = Files.lines(Paths.get("/Users/ankang/test", "export_pro.sh"))) {
            Optional<String> op = lines.filter(s -> s.contains("CURR_TIME")).findFirst();
            op.ifPresent(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }

        /**
         * BufferedReader对象也支持Stream的读取方式,但是Stream是由文件流创建的,在关闭Stream时并不会关闭文件流.
         * 所以该文件流的创建放在try语句的头部,使用try-with-resources语法自动关闭
         */
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/Users/ankang/test/export_pro.sh")))) {
            Stream<String> lines = br.lines();
        } catch (IOException e) {
            e.printStackTrace();
        }

        /**
         * 延迟读取目录,高效的处理拥有大量项目的目录
         * 类似方法:walk,find
         */
        try (Stream<Path> entries = Files.list(Paths.get("/Users/ankang/test"))) {
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
